//
//  LWComposeViewController.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/19.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit
import SVProgressHUD

class LWComposeViewController: UIViewController {
    
    //设置一个bool属性 记录textView上拉时 键盘的变化 默认 false
    private var isPull: Bool?
    
    
    //MARK: - 懒加载
    private lazy var titleLabel: UILabel = {
        
        let label = UILabel(textColor: .grayColor(), titleFont: 17)
        
        //换行
        label.numberOfLines = 0
        //居中显示
        label.textAlignment = .Center
        
        //获取用户名 用户名是存入到了  模型里面了  可以通过LWUserAccountViewModel 来获取 因为发送网络请求登录的方法写在了LWUserAccountViewModel中  并且将网络返回的数据都存入到了 LWUserAccountViewModel 的属性userAccount 中了
        
        if let name = LWUserAccountViewModel.sharedUserAccount.userAccount?.name {
            
            //要显示成 主标题和二级标题的形式  需要用到副本 label 的attributedText 属性
            //点进去看attributedText 这个属性  是一个NSAttributedString类型 所以我们需要一个 NSAttributedString类型的值来给它赋值  再一步步推
            
            //我们需要将用户名字体和颜色都改变 那么就需要知道用户名在字符串中的范围  获取到范围再来改字体颜色和大小
            let title = "发微博\n\(name)"
            let attributeStr = NSMutableAttributedString(string: title)
            
            //获取用户名的范围 现将String  类型 转换成 NSString
            let range = (title as NSString).rangeOfString(name)
            
            //设置用户名的颜色 和 大小
            attributeStr.addAttributes([NSForegroundColorAttributeName: UIColor.lightGrayColor(), NSFontAttributeName: UIFont.systemFontOfSize(12)],range: range)
            
            
            
            label.attributedText = attributeStr
            
            
            
        }else {
            
            label.text = "发微博"
            
        }
        
        //自动匹配输入文字的大小
        label.sizeToFit()
        
        
        return label
        
    }()
    
    
    //显示图片的CollectionView
    private lazy var pictureView: LWComposePictureCollectionView = {
        
        let view = LWComposePictureCollectionView()
        
        
        return view
        
    }()
    
    
     private lazy var rightButton: UIButton = UIButton.initButton("发送", titleFont: 17, normalColor: UIColor.whiteColor(), disabledColor: UIColor.grayColor(), normalImageName: "common_button_orange", highlightedImageName: "common_button_orange_highlighted", disabledImageName: "common_button_white_disable", target: self, action: "sendAction",size:CGSize(width: 45, height: 30))
    
    
    
    //  添加自定义Textview
    private lazy var textView: LWComposeTextView = {
        
        let view = LWComposeTextView()
        //设置代理  监听文本框变化,发送按钮的变化
        view.delegate = self
        
        view.placeHolder = "发送微博,那就输入吧😄"
        view.font = UIFont.systemFontOfSize(15)
        //  垂直方向开启弹簧效果 让textView可以滚动
        view.alwaysBounceVertical = true
        
        return view
        
    }()

    
    
    //toolBar
    private lazy var toolBar: LWComposeToolBar = {
        
        let view = LWComposeToolBar(frame: CGRectZero)
        
        return view        
        
    }()
    
    

    //MARK: - 表情键盘
    //表情键盘是要放在系统弹出的键盘上的 所以高度我们可以写死
    private lazy var keyBoardView: LWEmoticonKeyBoardView = {
        
       let view = LWEmoticonKeyBoardView()
        
        view.size = CGSize(width: self.textView.width, height: 216)
        
        return view
        
        
    }()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //设置背景
        view.backgroundColor = UIColor.whiteColor()

        //默认 false
        isPull = false
        
        layoutUI()
        
        
        
        
    }

    
    //MARK: - 接收通知
    private func receiveNotificationCenter() {
        
        //监听键盘的改变 键盘变化 就会走 keyboardChangeFrame: 这个方法
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardChangeFrame:", name: UIKeyboardWillChangeFrameNotification, object: nil)

        
        //监听表情按钮发送过来的通知 因为传递了模型,所以方法中有参数 加':'
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "didSelectedEmoticon:", name: ClickSeletedEmotionButtonNotification, object: nil)
        
        //接收删除表情按钮的点击 没有传参
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "didSelectedDeleteEmoticon", name: ClickSelecteDeleteEmoticonButtonNotification, object: nil)
        
        
    }
    
    
    
    
    //MARK: - 布局
    private func layoutUI() {
        
        //接收通知
        receiveNotificationCenter()
        
        setupNavUI()
        
        view.addSubview(textView)
        view.addSubview(toolBar)
        textView.addSubview(pictureView)
        
        
        textView.snp_makeConstraints { (make) -> Void in
            
            make.top.trailing.leading.equalTo(view)
            make.bottom.equalTo(self.toolBar.snp_top)
            
        }
        
        toolBar.snp_makeConstraints { (make) -> Void in
            
            make.leading.bottom.trailing.equalTo(view)
           
            make.height.equalTo(30)
            
        }
        
        pictureView.snp_makeConstraints { (make) -> Void in
            
            make.top.equalTo(textView).offset(100)
            
            make.leading.equalTo(textView).offset(10)
            
            make.width.equalTo(textView).offset(-20)
            
            make.height.equalTo(textView.snp_width).offset(-20)
            
        }

        
        //实现toolBar的闭包  完成按钮的点击事件
        toolBar.selectedToolBarButtonClosure = { [weak self] (type: LWComposeToolBarButtonType) in
            
            
            switch type {
                
            case .Picture:
                
                print("图片")
                //进入相册
                self?.didSelectedPicture()
                
            case .Mention:
                
                print("@")
                
            case .Trend:
                
                print("话题")
                
            case .Emoticon:
          
                print("表情")
                
                self?.didSelectedEmoticon()
                
                
            case .Add:
                
                print("加号")
                
                
            }
            
            
        }
        
        //实现cell上面的加号点击事件
        pictureView.didSelectedAddClosure = { [weak self] in
            
            //进入相册
            self?.didSelectedPicture()
            
            
        }

        
        
        
    }
    
    
    
    
    //MARK: - 键盘改变的事件 
    //键盘一改变就会走这个方法
    @objc private func keyboardChangeFrame(noti: NSNotification) {
        
        //打印 noti
//        print(noti)
        
        //获取键盘改变时的frame  根据noti打印出来的值 来取
        //noti 是一个字典   取出来的值需要进行类型转换
        let keyboardFrame = (noti.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
        
        //获取动画时长  这个动画时长是系统自带的 就在noti中
        let duration = (noti.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).doubleValue
        
        
        //更新约束
        toolBar.snp_updateConstraints { (make) -> Void in
            
            make.bottom.equalTo(view).offset(keyboardFrame.origin.y - SCreenHeight)
            
            
        }
        
        
        //执行动画  更新约束后 一定要写ifNeeded这个方法
        UIView.animateWithDuration(duration) { () -> Void in
            
            self.view.layoutIfNeeded()
           
            
        }
        
        
//        if toolBar.y != SCreenHeight - toolBar.width {
//            
//           
//                
//                isPull = !isPull!
//           
//            
//        }
        
        
    }
    
    
    
    //MARK: - 有关表情按钮和删除表情按钮的点击事件
    //表情按钮点击事件
    @objc private func didSelectedEmoticon(noti: NSNotification) {
        
        //有关表情按钮点击后给textView赋值，因为我们只需要拿到模型,其余逻辑完全可以在textView中做 但是因为我们自定义的LWComposeTextView已经封装很好了,为了不改动LWComposeTextView  我们将表情键盘的逻辑写在自定义的LWComposeTextView 的 分类中
        
        let emoticon = noti.object as! LWEmoticon
        
        //进入到LWComposeTextView的分类中
        textView.insertEmoticon(emoticon)
        
        
        
        
    }
    
    
    //删除表情按钮点击事件
    @objc private func didSelectedDeleteEmoticon() {
        
        //  删除内容  这是个系统方法  系统会自己去删
        textView.deleteBackward()
        
    }
    
    
    //MARK: - 移除通知
    deinit {
        
        //所有通知都移除
        NSNotificationCenter.defaultCenter().removeObserver(self)
        
    }
    
    
    
    
    //MARK: - 创建取消和发送按钮
    private func setupNavUI() {
        
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", target: self, action: "cancelAction")
        
        
        
        navigationItem.titleView = titleLabel
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightButton)
        
        //默认禁用发送按钮
        navigationItem.rightBarButtonItem?.enabled = false
        
    }
    
    
    
    
    
    
    
    
    // MARK: -- 点击事件处理
    @objc private func cancelAction() {
        //结束编辑 让键盘先消失
        self.view.endEditing(true)
        
        //移除当前控制器
        dismissViewControllerAnimated(true, completion: nil)
        
    }


    //MARK: - 发送微博
    @objc private func sendAction() {
        
        if pictureView.imagesArr.count > 0 { //如果有图片
            
            //发送文字和图片微博的接口
            postTitleAndPictureNetwork()
            
            
        }else {
            
            //发送文字微博
            sendTitleNetwork()
            
            
        }
        //  发送成功
        SVProgressHUD.showSuccessWithStatus("发送成功")

        
   }

    
    
    
    //MARK: - 发送文字微博的接口
    private func sendTitleNetwork() {
        
        
        let access_token = LWUserAccountViewModel.sharedUserAccount.access_token!
        
        let text = textView.emoticonString
        
        //show一下 让用户知道正在加载 菊花转
        SVProgressHUD.show()
        
        LWNetworkTools.sharedTools.update(access_token, status: text) { (response, error) -> () in
            
            //因为是发表微博  我们只需要知道成功与否  服务器返回的数据也就是告诉我们发送成功没有
            
            if error != nil {
                
                SVProgressHUD.showErrorWithStatus("发送失败")
                
                return
                
            }
            
            
            
        }

    
    
    }




    //MARK: - 发送文字和图片微博的接口
    private func postTitleAndPictureNetwork() {
        
        
        let image = pictureView.imagesArr.first!
        let access_token = LWUserAccountViewModel.sharedUserAccount.access_token!
        
        //获取富文本对应的字符串 因为服务器只是别字符串 不识别图片表情 将图片转换成对应的字符串 已经放在了LWComposeTextView 的 分类中了
        let text = textView.emoticonString
        
        //菊花转
        SVProgressHUD.show()
        
        LWNetworkTools.sharedTools.upload(access_token, status: text, image: image, callBack: { (response, error) -> () in
            
            
            if error != nil {
                
                SVProgressHUD.showErrorWithStatus("发送失败")
                
                return
                
            }
            
            
        })
        
        

        
        
        
    }

}









//MARK: - 处理toolBar按钮的逻辑
//toolBar上的按钮,点击后,会执行某些事件  我们使用系统的  (一次只能选中一张图片)
extension LWComposeViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {//协议 第一个协议和第二个协议都是系统的协议
    
    
    //MARK: - 表情键盘的处理
    
    func didSelectedEmoticon() {
        
        if textView.inputView == nil { //为nil时,是系统的键盘  这时要替换掉
            //替换系统键盘
           textView.inputView = keyBoardView
            
            
        }else { //如果是替换后的键盘
            
            //我们点击按钮后 就要换回系统的
            textView.inputView = nil
            
            
        }
        
         toolBar.showEmotionIcon(textView.inputView == nil)
        
        
        //弹出键盘  设置第一响应者
        textView.becomeFirstResponder()
        
        //刷新一下键盘
        textView.reloadInputViews()
        
        
    }
    
    
    
    
    
    
    
    //MARK: - 进入相册
    // 进入相册 选中那张图片 自定义的方法
    func didSelectedPicture() {
        
        //创建控制器
        let imagePictureCtr = UIImagePickerController()
        
        //设置代理  
        imagePictureCtr.delegate = self
        
        //判断是否支持这个来源类型
        if UIImagePickerController.isSourceTypeAvailable(.Camera) { //支持相机
            
            imagePictureCtr.sourceType = .Camera
            print("支持相机")
            
        }else {
            
            imagePictureCtr.sourceType = .PhotoLibrary
            
            print("不支持相机,使用的图库")
            
        }
        
        
        if UIImagePickerController.isCameraDeviceAvailable(.Front) {
            
            print("支持前置摄像头")
            
        }else if UIImagePickerController.isCameraDeviceAvailable(.Rear) {
            
            print("支持后置摄像头")

            
        }else {
            
            print("前后置摄像头不支持")
            
        }
        
        
        //允许用户编辑图片
//        imagePictureCtr.allowsEditing = true
        
        //进入相册
        presentViewController(imagePictureCtr, animated: true, completion: nil)
        
        
        
    }
    
    
    //这个方法是获取选中的图片,如果实现了协议就不会自己调用dismissViewControllerAnimated  需要手动调用
   func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
        
        //scaleImageWithScaleWidth 这个获取缩略图的方法 我们写到UIImage 的分类中
        let scaleImage = image.scaleImageWithScaleWidth(200)
    
    
        //将缩略图给pictureView中的数组 通过这个方法传过去
        pictureView.addImageAndBarButton(scaleImage,sendBtn: navigationItem.rightBarButtonItem!)
    
    
        //选中之后,移除当前控制器(即相册)  回到上一个控制器(即发微博界面)
        picker.dismissViewControllerAnimated(true, completion: nil)
        
        
    }
    
    
    //这个协议方法如果实现了,相册里面的取消按钮就没作用了  要手动调用dismissViewControllerAnimated
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        
           picker.dismissViewControllerAnimated(true, completion: nil)
        
        
    }
    
    
}







//MARK: - TextView的代理
extension LWComposeViewController: UITextViewDelegate {
    func textViewDidChange(textView: UITextView) {
        
        //  根据文本内容判断发送按钮是否可用  根据文本的内容来判断
        navigationItem.rightBarButtonItem?.enabled = textView.hasText()
        
    }
    
    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        
        //取反
//        isPull = !isPull!
        
//        
//        if isPull! {
//            
//            //成为第一响应者
//           textView.becomeFirstResponder()
//            
//        }else {
//            
//            //滚动时  结束编辑模式
//            self.view.endEditing(true)
//
//            
//        }
        
        
        //滚动时  结束编辑模式
        self.view.endEditing(true)

        
        
    }
    
}

